/*
 * @Author: 码农 2646995216@qq.com
 * @Date: 2025-03-22 13:01:05
 * @LastEditors: 码农 2646995216@qq.com
 * @LastEditTime: 2025-03-24 22:29:44
 * @FilePath: /http/httpserver.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#pragma once
#include "socket.hpp"
#include <functional>
#include <sstream>
#include "ios.hpp"

const uint16_t PORT=8989;

// http服务器
class HttpServer
{
	typedef function<void(const HttpRequest&, HttpResponse&)> func_t;

public:
	HttpServer(func_t func, uint16_t port = PORT)
		: _func(func), _port(port)
	{
	}

	// 初始化
	void Init()
	{
		_listensockfd.Socket();	   // 创建套接字
		_listensockfd.Bind(_port); // 绑定
		_listensockfd.Listen();	   // 监听
	}

	// 运行
	void Start()
	{
		while (true)
		{
			string clientip;
			uint16_t clientport;
			int sockfd = _listensockfd.Accept(clientip, clientport); // 链接等待
			if (socket < 0)
			{
				cout << "Accept false" << endl;
				continue;
			}

			pid_t pid = fork(); // 创建子进程
			if (pid == 0)
			{
				_listensockfd.Close(); // 关闭监听网络适配符
				if (fork() > 0)		   // 创建子进程，将父进程关闭，使其成为孤儿进程
				{
					exit(0);
				}

				hander_enter(sockfd); // 处理客户端的信息
				close(sockfd);		  // 关闭网络适配符
				exit(0);
			}
		}
	}

	// 处理
	void hander_enter(int sockfd)
	{
		HttpRequest req;   // 创建请求
		HttpResponse resp; // 创建回应

		char buffer[4096]; // 存储客户端发来的信息
		ssize_t n = recv(sockfd, buffer, sizeof(buffer) - 1, 0);
		if (n > 0)
		{
			buffer[n] = 0;
			req.inbuffer = buffer;     // 将信息给请求													// 反序列化
			req.parse();      //将请求反序列化，将请求中的数据存入HttpRequest类中                                        
			_func(req, resp);	       // 将请求给回应
			send(sockfd, resp.outbuffer.c_str(), resp.outbuffer.size(), 0); // 将回应写回
		}
	}

private:
	uint16_t _port;      //端口号
	Sock _listensockfd;  //套接字
	func_t _func;        

};